home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 2.toast / pc / sample code / quicktime / basics / show movie / movieprefs.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-28  |  14.6 KB  |  505 lines

  1. /*
  2.     File:        MoviePrefs.c
  3.  
  4.     Contains:        movie handling routines
  5.  
  6.     Written by: Jason Hodges-Harris & Don Swatman    
  7.  
  8.     Copyright:    Copyright © 1995-1999 by Apple Computer, Inc., All Rights Reserved.
  9.  
  10.                 You may incorporate this Apple sample source code into your program(s) without
  11.                 restriction. This Apple sample source code has been provided "AS IS" and the
  12.                 responsibility for its operation is yours. You are not permitted to redistribute
  13.                 this Apple sample source code as "Apple sample source code" after having made
  14.                 changes. If you're going to re-distribute the source, we require that you make
  15.                 it clear in the source that the code was descended from Apple sample source
  16.                 code, but that you've made changes.
  17.  
  18.     Change History (most recent first):
  19.                 8/17/1999    Karl Groethe    Updated for Metrowerks Codewarror Pro 2.1
  20.                 
  21.  
  22. */
  23. #include <Dialogs.h>
  24. #include <TextUtils.h>
  25.  
  26. #include "MoviePrefs.h"
  27.  
  28. #include "MovieStuff.h"
  29.  
  30.  
  31. //==============================================
  32. // Global Stuff, init and tear down             
  33. //==============================================
  34.  
  35. // Prototypes of functions  used in UPPs
  36. pascal void DrawDLOGFrameRect(WindowPtr theDialog, short itemNo);
  37.  
  38. // Global UPPs
  39. UserItemUPP     gDLOGFrameUpp;
  40.  
  41. // Globals
  42. MovieOptionsType gDefaultMoviePrefs;
  43.  
  44. //----------------------------------------------
  45. // InitMoviePrefs
  46. //
  47. // Init's any globals used in MovieStuff
  48. // i.e. the UPPs             
  49. //----------------------------------------------
  50. void InitMoviePrefs(void)
  51. {
  52.     gDLOGFrameUpp = nil;
  53. // Create Dialog Frame Upp for "DrawDLOGFrameRect"
  54.     gDLOGFrameUpp = NewUserItemProc( DrawDLOGFrameRect );
  55.  
  56. // Set up the default movie prefs
  57.     SetUpDefaultMoviePref( &gDefaultMoviePrefs );
  58. }
  59.  
  60. //----------------------------------------------
  61. // KillMoviePrefs
  62. //
  63. // Removes the UPPs             
  64. //----------------------------------------------
  65. void KillMoviePrefs(void)
  66. {
  67. // Clear the Universal Proc Pointers
  68. //    You don't need to do this as quiting the app will do it for you,
  69. //    however, I have this thing about neatness.    
  70.     if (gDLOGFrameUpp)
  71.         DisposeRoutineDescriptor(gDLOGFrameUpp);
  72.         
  73. }
  74.  
  75. //----------------------------------------------
  76. //  SetUpDefaultMoviePref 
  77. //
  78. // Puts the standard options into a MovieOptionsType
  79. // preference record                                  
  80. //----------------------------------------------
  81. void SetUpDefaultMoviePref ( MovieOptionsType *theOptions )
  82. {
  83.     (*theOptions).closeAtEnd      = kUserCloseWind;       // User has to close the window
  84.     (*theOptions).hasController   = kHasMovieController;  // Movie has a controller
  85.     (*theOptions).do20to10Loop    = false;     // Don't do the loop stuff
  86.     (*theOptions).loopFrom        = 20;        // Set loop to start at 20 secs
  87.     (*theOptions).loopTo          = 10;        //    and loop to 10 secs
  88.     (*theOptions).rateChangeDelay = kInSync;   // No rate change stuff
  89.     (*theOptions).slaveAheadBy    = kInSync;   // Slave is in sync with master
  90.     (*theOptions).slaveStartDelay = kInSync;   // Slave starts at the same time as the master
  91. }
  92.  
  93. //==============================================
  94. // Usefull dialog item stuff
  95. //==============================================
  96.  
  97. //----------------------------------------------
  98. //  InstallCustomDlogItem                                   
  99. //----------------------------------------------
  100.  
  101. void InstallCustomDlogItem( DialogPtr theDialog,
  102.                                                         short     itemNum,
  103.                                                         UserItemUPP customProcUpp );
  104. void InstallCustomDlogItem( DialogPtr theDialog,
  105.                                                         short     itemNum,
  106.                                                         UserItemUPP customProcUpp )
  107. {
  108.     short     itemType;
  109.     Handle    itemHandle;
  110.     Rect      itemRect;
  111.  
  112.     GetDialogItem(theDialog, itemNum, &itemType, &itemHandle, &itemRect);
  113.     SetDialogItem(theDialog, itemNum, itemType, (Handle)customProcUpp, &itemRect);
  114. }
  115.  
  116. //----------------------------------------------
  117. //  DrawDLOGFrameRect
  118. //
  119. // Dialog custom draw item. It draws a frame round the 
  120. // items's rect so it can be used to frame areas                              
  121. //----------------------------------------------
  122.  
  123. pascal void DrawDLOGFrameRect(WindowPtr theDialog, short itemNo)
  124. {
  125.     short     itemType;   //returned item type
  126.     Rect      itemRect;   //returned display rectangle
  127.     Handle    itemHandle; //returned item handle
  128.     WindowPtr oldPort;
  129.     PenState  curPen;
  130.  
  131. // Get information about the item ( including it's rect )
  132.     GetDialogItem(theDialog, itemNo, &itemType, &itemHandle, &itemRect);
  133.  
  134. // Save the current port and the pen's state
  135.     GetPort(&oldPort);
  136.     SetPort( theDialog );
  137.     GetPenState(&curPen);
  138.  
  139. // Draw the frame with a normal pen
  140.     PenNormal();
  141.     FrameRect( &itemRect );
  142.  
  143. // Reset the pen state and the port
  144.     SetPenState(&curPen);
  145.     SetPort(oldPort);
  146. }
  147.  
  148. //==============================================
  149. //  Movie Preferences                                   
  150. //==============================================
  151.  
  152. //----------------------------------------------
  153. // Constants used in the dialog box
  154. //----------------------------------------------
  155.  
  156. #define kOneMovieID 9000
  157.  
  158. enum {
  159.         kOkButton = 1,
  160.         kCancelButton,
  161.         kTitleStatic,
  162.         kHelpBox,
  163.         kHelpTitle,
  164.         kHelpText,
  165.         kCloseAtEnd,
  166.         kHasController,
  167.         kDoTheLoop,
  168.         kRateChangePU,
  169.         kSlaveAheadPU,
  170.         kSlaveDelayStartPU,
  171.         kSlaveBox,
  172.         kSlaveTitle
  173. };
  174.  
  175. //----------------------------------------------
  176. // ConvertTimeToMenuItem
  177. //
  178. // Converts one of the time values into the pop up menu's
  179. // selected item.
  180. //----------------------------------------------
  181.  
  182. short ConvertTimeToMenuItem( short time );
  183. short ConvertTimeToMenuItem( short time )
  184. {
  185.     short menuItem = 1; // default the item to 1, normally kInSync
  186.     
  187.     switch (time)
  188.     {
  189.     case (kInSync):
  190.         menuItem = 1;
  191.         break;
  192.     case (kOneThird):
  193.         menuItem = 2;
  194.         break;
  195.     case (10):
  196.         menuItem = 3;
  197.         break;
  198.     }
  199.     return ( menuItem );
  200. }
  201.  
  202. //----------------------------------------------
  203. // ConvertMenuItemToTime
  204. //
  205. // Converts a pop up menu's selected item into
  206. // one of the time values
  207. //----------------------------------------------
  208.  
  209. short ConvertMenuItemToTime( short menuItem );
  210. short ConvertMenuItemToTime( short menuItem )
  211. {
  212.     short time = kInSync;  // default to kInSync (i.e. don't do anything)
  213.     
  214.     switch (menuItem)
  215.     {
  216.     case (1):
  217.         time = kInSync;
  218.         break;
  219.     case (2):
  220.         time = kOneThird;
  221.         break;
  222.     case (3):
  223.         time = 10;
  224.         break;
  225.     }
  226.     return ( time );
  227. }
  228.  
  229. //----------------------------------------------
  230. // SetUpOneMovieDLOG
  231. //
  232. // Sets up the items in the preferences dialog
  233. // depending on "MovieOptionsType *theOptions"
  234. // In general, each chunk get's the control handle from
  235. // a dialog item and set's it up appropriately
  236. //----------------------------------------------
  237.  
  238. void SetUpOneMovieDLOG( DialogPtr oneMovieDialog,
  239.                                                 MovieOptionsType *theOptions,
  240.                                                 Boolean hasSlaveMovie );
  241.  
  242. void SetUpOneMovieDLOG( DialogPtr oneMovieDialog,
  243.                                                 MovieOptionsType *theOptions,
  244.                                                 Boolean hasSlaveMovie )
  245. {
  246.     short     itemType;
  247.     Handle    item;
  248.     Rect      box;
  249.     short     newPUValue;
  250.  
  251. // Set up the frame boxes custom items
  252.     InstallCustomDlogItem( oneMovieDialog, kHelpBox, gDLOGFrameUpp );
  253.     InstallCustomDlogItem( oneMovieDialog, kSlaveBox, gDLOGFrameUpp );
  254.  
  255. // kCloseAtEnd from closeAtEnd
  256.     GetDialogItem( oneMovieDialog, kCloseAtEnd, &itemType, &item, &box);
  257.     if ((*theOptions).closeAtEnd)
  258.         SetControlValue ((ControlHandle)item, 1);
  259.     else
  260.         SetControlValue ((ControlHandle)item, 0);
  261.  
  262. // kHasController from hasController
  263.     GetDialogItem( oneMovieDialog, kHasController, &itemType, &item, &box);
  264.     if ((*theOptions).hasController)
  265.         SetControlValue ((ControlHandle)item, 1);
  266.     else
  267.         SetControlValue ((ControlHandle)item, 0);
  268.  
  269. // kDoTheLoop from do20to10Loop
  270.     GetDialogItem( oneMovieDialog, kDoTheLoop, &itemType, &item, &box);
  271.     if ((*theOptions).do20to10Loop)
  272.         SetControlValue ((ControlHandle)item, 1);
  273.     else
  274.         SetControlValue ((ControlHandle)item, 0);
  275.  
  276. // kRateChangePU from rateChangeDelay
  277.     GetDialogItem( oneMovieDialog, kRateChangePU, &itemType, &item, &box);
  278.     newPUValue = ConvertTimeToMenuItem( (*theOptions).rateChangeDelay );
  279.     SetControlValue ((ControlHandle)item, newPUValue);
  280.  
  281. // kSlaveAheadPU from slaveAheadBy
  282.     GetDialogItem( oneMovieDialog, kSlaveAheadPU, &itemType, &item, &box);
  283.     newPUValue = ConvertTimeToMenuItem( (*theOptions).slaveAheadBy );
  284.     SetControlValue ((ControlHandle)item, newPUValue);
  285. // If we're not setting up a master/slave them we don't need
  286. // this , so gray it out
  287.     if (!hasSlaveMovie)
  288.         HiliteControl ((ControlHandle)item, 255);
  289.  
  290. // Set slave start delay PU
  291.     GetDialogItem( oneMovieDialog, kSlaveDelayStartPU, &itemType, &item, &box);
  292.     newPUValue = ConvertTimeToMenuItem( (*theOptions).slaveStartDelay );
  293.     SetControlValue ((ControlHandle)item, newPUValue);
  294. // If we're not setting up a master/slave them we don't need
  295. // this , so gray it out
  296.     if (!hasSlaveMovie)
  297.         HiliteControl ((ControlHandle)item, 255);
  298.  
  299. }
  300.  
  301. //----------------------------------------------
  302. // GetOneMovieDLOG
  303. //
  304. // Gets the information from the items in the preferences
  305. // dialog and puts them back in "MovieOptionsType *theOptions"
  306. // In general, each chunk get's the control handle from
  307. // a dialog item and interprates the result accordingly
  308. //----------------------------------------------
  309.  
  310. void GetOneMovieDLOG( DialogPtr oneMovieDialog,
  311.                                             MovieOptionsType *theOptions );
  312.  
  313. void GetOneMovieDLOG( DialogPtr oneMovieDialog,
  314.                                             MovieOptionsType *theOptions )
  315. {
  316.     short  itemType;
  317.     Handle item;
  318.     Rect   box;
  319.     short  newPUValue;
  320.  
  321. // kCloseAtEnd into closeAtEnd
  322.     GetDialogItem( oneMovieDialog, kCloseAtEnd, &itemType, &item, &box);
  323.     (*theOptions).closeAtEnd = (GetControlValue ((ControlHandle)item) == 1);
  324.  
  325. // kHasController into hasController
  326.     GetDialogItem( oneMovieDialog, kHasController, &itemType, &item, &box);
  327.     (*theOptions).hasController = (GetControlValue ((ControlHandle)item) == 1);
  328.  
  329. // kDoTheLoop into do20to10Loop
  330.     GetDialogItem( oneMovieDialog, kDoTheLoop, &itemType, &item, &box);
  331.     (*theOptions).do20to10Loop = (GetControlValue ((ControlHandle)item) == 1);
  332.  
  333. // kRateChangePU into rateChangeDelay
  334.     GetDialogItem( oneMovieDialog, kRateChangePU, &itemType, &item, &box);
  335.     newPUValue = GetControlValue ((ControlHandle)item);
  336.     (*theOptions).rateChangeDelay = ConvertMenuItemToTime( newPUValue );
  337.  
  338. // kSlaveAheadPU into slaveAheadBy
  339.     GetDialogItem( oneMovieDialog, kSlaveAheadPU, &itemType, &item, &box);
  340.     newPUValue = GetControlValue ((ControlHandle)item);
  341.     (*theOptions).slaveAheadBy = ConvertMenuItemToTime( newPUValue );
  342.  
  343. // kSlaveDelayStartPU into slaveStartDelay
  344.     GetDialogItem( oneMovieDialog, kSlaveDelayStartPU, &itemType, &item, &box);
  345.     newPUValue = GetControlValue ((ControlHandle)item);
  346.     (*theOptions).slaveStartDelay = ConvertMenuItemToTime( newPUValue );
  347. }
  348.  
  349. //----------------------------------------------
  350. // GetItemHelpText
  351. //
  352. // Item hit gives the last item clicked on, interprates
  353. // its current state and returns an appropriate comment
  354. // in "helpString"
  355. //----------------------------------------------
  356.  
  357. void GetItemHelpText( DialogPtr oneMovieDialog,
  358.                                             Str255    helpString,
  359.                                             short     itemHit );
  360.  
  361. void GetItemHelpText( DialogPtr oneMovieDialog,
  362.                                             Str255    helpString,
  363.                                             short     itemHit )
  364. {
  365.     short   itemType;
  366.     Handle  item;
  367.     Rect    box;
  368.     short   strNum = 1; // Resource index of the string we want
  369.     
  370.     
  371. // Get information about the last dialog item clicked on
  372.     GetDialogItem( oneMovieDialog, itemHit, &itemType, &item, &box);
  373.  
  374. // Look at what was last hit and what it's state is
  375.     switch (itemHit)
  376.     {
  377.     case (kCloseAtEnd) :
  378.         if (GetControlValue ((ControlHandle)item))
  379.             strNum = 2;
  380.         else
  381.             strNum = 3;
  382.         break;
  383.     case (kHasController) :
  384.         if (GetControlValue ((ControlHandle)item))
  385.             strNum = 4;
  386.         else
  387.             strNum = 5;
  388.         break;
  389.     case (kDoTheLoop) :
  390.         if (GetControlValue ((ControlHandle)item))
  391.             strNum = 6;
  392.         else
  393.             strNum = 7;
  394.         break;
  395.     case (kRateChangePU) :
  396.         strNum = GetControlValue ((ControlHandle)item) + 7;
  397.         break;
  398.     case (kSlaveAheadPU) :
  399.         strNum = GetControlValue ((ControlHandle)item) + 10;
  400.         break;
  401.     case (kSlaveDelayStartPU) :
  402.         strNum = GetControlValue ((ControlHandle)item) + 13;
  403.         break;
  404.     };
  405.  
  406. // Now get helpString from the resource file
  407.     GetIndString ( helpString, kOneMovieID, strNum);
  408. }
  409.  
  410. //----------------------------------------------
  411. // OneMoviePref
  412. //
  413. // This creates, handles and destroys the movie
  414. // preferences dialog box
  415. //----------------------------------------------
  416.  
  417. OSErr OneMoviePref( MovieOptionsType *theOptions,
  418.                                         Boolean hasSlaveMovie )
  419. {
  420.     OSErr     theErr = noErr;
  421.     GrafPtr   savePort = nil;
  422.     DialogPtr oneMovieDialog;
  423.     ModalFilterUPP theFilter = nil;
  424.     short     itemHit = 0;  // Item clicked by user
  425.     short     lastHit = 0;  // Last item clicked by user
  426.     Str255    helpString;   // help String
  427.     short     itemType;
  428.     Handle    item;
  429.     Rect      box;
  430.     short     checkBox;  //Temporary value of a checkbox control
  431.     
  432.   GetPort(&savePort);
  433.  
  434. // Load the resource from the res file
  435.     oneMovieDialog = GetNewDialog(kOneMovieID, nil, (WindowPtr) -1 );
  436.  
  437. // Setup the dialogs items
  438.     SetUpOneMovieDLOG( oneMovieDialog, theOptions, hasSlaveMovie );
  439.     
  440. // Show the dialog to the user now it's set up
  441.   SetPort( oneMovieDialog );
  442.     ShowWindow( oneMovieDialog );
  443.         
  444. // Get the standard filter proc
  445.   if (GetStdFilterProc(&theFilter) != noErr)
  446.       DebugStr("\pFailed to get standard dialog filter.");
  447.   
  448. // Tell the OS which items the <OK> and <Cancel> buttons are
  449.     SetDialogDefaultItem( oneMovieDialog, kOkButton);
  450.     SetDialogCancelItem ( oneMovieDialog, kCancelButton);
  451.   
  452. // Modal dialog loop
  453.     do
  454.     {
  455. // Use "theFilter" in ModalDialog call
  456.        ModalDialog(theFilter,&itemHit);
  457.  
  458.         switch (itemHit)
  459.         {
  460. // Toggle Check box type items
  461.             case (kCloseAtEnd) :
  462.             case (kHasController) :
  463.             case (kDoTheLoop) :
  464.     // Get the control handle - in item
  465.                 GetDialogItem( oneMovieDialog, itemHit, &itemType, &item, &box);
  466.     // Get the current state of the check box
  467.                 checkBox = GetControlValue ((ControlHandle)item);
  468.     // Toggle it's state
  469.                 checkBox = 1 - checkBox;
  470.     // Put the new item into the control
  471.                 SetControlValue ((ControlHandle)item, checkBox);
  472.                 break;
  473.         }
  474.  
  475. // Put up the help text
  476.         if ((itemHit != lastHit) && (itemHit > 0))
  477.         {
  478.     // Work out what text we're going to put up
  479.             GetItemHelpText( oneMovieDialog, helpString, itemHit );
  480.     //  and put it into the static text item 
  481.             GetDialogItem ( oneMovieDialog, kHelpText, &itemType, &item, &box);
  482.             SetDialogItemText (item, helpString);
  483.         }
  484.     } while ((itemHit != kOkButton) && (itemHit != kCancelButton));
  485. // Keep going until the <OK> and <Cancel> have been hit
  486.  
  487. // If the <OK> button was pressed then extract the information
  488. // from the dialog items, and return noErr
  489.     if (itemHit == kOkButton)
  490.     {
  491.         GetOneMovieDLOG( oneMovieDialog, theOptions );
  492.         theErr = noErr;
  493.     }
  494.     else
  495. // <Cancel> button was pressed so return userCanceledErr
  496.         theErr = userCanceledErr;
  497.  
  498. // Dispose of the dialog and reset the port
  499.   DisposeDialog(oneMovieDialog);
  500.   SetPort(savePort);
  501.   
  502.   return ( theErr );
  503. }
  504.  
  505.